Dockerfile হল একটি টেক্সট ফাইল যা নির্দেশনা এবং কমান্ড ধারণ করে, যা Docker Image তৈরি করতে ব্যবহৃত হয়। এটি কন্টেইনারের জন্য একটি প্রস্তুতি তৈরি করে, যা অ্যাপ্লিকেশন এবং এর সমস্ত নির্ভরতাগুলিকে একটি প্যাকেজে ধারণ করে। Dockerfile থেকে Docker Image তৈরি করার প্রক্রিয়া সহজ এবং কার্যকর।
Dockerfile তৈরি করার পদক্ষেপ
১. Dockerfile তৈরি করা
একটি নতুন ডিরেক্টরি তৈরি করুন এবং সেখানে একটি ফাইল তৈরি করুন Dockerfile নামে। নিচে একটি সাধারণ উদাহরণ দেওয়া হলো:
# Dockerfile
# বেস ইমেজ হিসাবে Alpine ব্যবহার করা হচ্ছে
FROM alpine:latest
# ইমেজের মেন্টেইনারের তথ্য
LABEL maintainer="your_email@example.com"
# প্রয়োজনীয় প্যাকেজ ইনস্টল করা
RUN apk add --no-cache python3 py3-pip
# কাজের ডিরেক্টরি তৈরি এবং সেট করা
WORKDIR /app
# লোকার ফাইল এবং স্ক্রিপ্ট কপি করা
COPY requirements.txt ./
RUN pip3 install -r requirements.txt
# অ্যাপ্লিকেশন স্ক্রিপ্ট কপি করা
COPY . .
# ডিফল্ট কমান্ড
CMD ["python3", "app.py"]
২. Dockerfile ব্যাখ্যা
FROM: বেস ইমেজ হিসাবে কোন ইমেজ ব্যবহার করতে চান তা নির্ধারণ করে। এখানে alpine:latest ব্যবহার করা হয়েছে।
LABEL: ইমেজের তথ্য যোগ করতে ব্যবহৃত হয়, যেমন মেন্টেইনারের নাম এবং যোগাযোগের তথ্য।
RUN: কন্টেইনার তৈরি করার সময় একটি কমান্ড চালানোর জন্য ব্যবহৃত হয়। এখানে, apk add কমান্ড ব্যবহার করে প্রয়োজনীয় প্যাকেজগুলি ইনস্টল করা হয়েছে।
WORKDIR: কন্টেইনারে কাজ করার জন্য নির্দিষ্ট একটি ডিরেক্টরি তৈরি করে এবং সেট করে।
COPY: আপনার লোকাল ফাইল সিস্টেম থেকে ফাইল কন্টেইনারে কপি করে। এখানে requirements.txt এবং অন্যান্য ফাইল কপি করা হয়েছে।
CMD: কন্টেইনার চালানোর সময় ডিফল্ট কমান্ড নির্ধারণ করে।
Docker Image তৈরি করার প্রক্রিয়া
১. Docker Image তৈরি করা
Dockerfile তৈরি করার পর, আপনি Docker Image তৈরি করতে পারেন। নিচের কমান্ডটি ব্যবহার করুন:
docker build -t my-app-image .
এখানে -t ফ্ল্যাগটি নতুন ইমেজের নাম এবং ট্যাগ নির্ধারণ করে। . নির্দেশ করে যে Dockerfile বর্তমান ডিরেক্টরিতে অবস্থিত।
২. Docker Image যাচাই করা
Docker Image তৈরি হওয়ার পর, এটি যাচাই করার জন্য নিচের কমান্ডটি ব্যবহার করুন:
docker images
এটি আপনার সিস্টেমে উপলব্ধ সমস্ত Docker Images তালিকাবদ্ধ করবে, এবং আপনার নতুন তৈরি করা ইমেজটি সেখানে থাকবে।
Docker Image থেকে কন্টেইনার তৈরি করা
Docker Image তৈরি করার পর, আপনি কন্টেইনার তৈরি এবং চালানোর জন্য নিচের কমান্ডটি ব্যবহার করতে পারেন:
bash
Copy code
docker run -d --name my-app-container my-app-image
এখানে:
-dঅপশনটি কন্টেইনারকে ব্যাকগ্রাউন্ডে চালানোর জন্য।--nameঅপশনটি কন্টেইনারের জন্য একটি নাম নির্ধারণ করে।
সারসংক্ষেপ
Dockerfile তৈরি করা এবং Docker Image তৈরি করার প্রক্রিয়া সহজ এবং কার্যকর। Dockerfile-এ নির্দিষ্ট নির্দেশনা এবং কমান্ড ব্যবহার করে আপনি একটি কাস্টম Docker Image তৈরি করতে পারেন। এই প্রক্রিয়া শেষে, আপনি তৈরি করা ইমেজ থেকে কন্টেইনার তৈরি করে আপনার অ্যাপ্লিকেশন চালাতে পারেন। Docker-এর এই ক্ষমতা ডেভেলপারদের জন্য সফটওয়্যার ডেভেলপমেন্ট এবং ডিপ্লয়মেন্টের প্রক্রিয়া অনেক সহজ করে তোলে।
Dockerfile হল একটি টেক্সট ফাইল যা Docker Images তৈরি করতে ব্যবহৃত হয়। এটি কন্টেইনারের জন্য প্রয়োজনীয় নির্দেশনা, কমান্ড, এবং কনফিগারেশন ধারণ করে। Dockerfile ব্যবহার করে, আপনি একটি নির্দিষ্ট অ্যাপ্লিকেশন এবং তার নির্ভরতাগুলি সংজ্ঞায়িত করতে পারেন, যা পরবর্তীতে Docker দ্বারা একটি কন্টেইনার ইমেজে রূপান্তরিত হয়।
Dockerfile-এর গঠন
একটি Dockerfile সাধারণত নিম্নলিখিত অংশগুলির সমন্বয়ে গঠিত:
- FROM: বেস ইমেজ নির্দেশ করে।
- LABEL: মেটাডেটা যুক্ত করে।
- RUN: ইমেজ তৈরি করার সময় কমান্ড চালায়।
- COPY এবং ADD: ফাইল এবং ডিরেক্টরি কপি করে।
- WORKDIR: কাজের ডিরেক্টরি সেট করে।
- CMD এবং ENTRYPOINT: কন্টেইনার শুরু হলে চালানোর জন্য কমান্ড নির্ধারণ করে।
- ENV: পরিবেশের ভেরিয়েবল সেট করে।
Dockerfile-এর মৌলিক উপাদানগুলো
১. FROM
- বর্ণনা: এটি Dockerfile-এর প্রথম লাইন, যা নির্দেশ করে কোন বেস ইমেজ ব্যবহার করা হবে।
- উদাহরণ:
FROM ubuntu:20.04
২. LABEL
- বর্ণনা: ইমেজের জন্য মেটাডেটা যোগ করে। এটি নির্মাতার তথ্য বা অন্যান্য সংক্রান্ত তথ্য ধারণ করতে পারে।
- উদাহরণ:
LABEL maintainer="your_email@example.com"
৩. RUN
- বর্ণনা: এটি Docker Image তৈরি করার সময় কমান্ড চালানোর জন্য ব্যবহৃত হয়। এটি নতুন লেয়ার তৈরি করে।
- উদাহরণ:
RUN apt-get update && apt-get install -y python3
৪. COPY
- বর্ণনা: লোকাল ফাইল সিস্টেম থেকে কন্টেইনারের ভিতরে ফাইল কপি করে।
- উদাহরণ:
COPY . /app
৫. ADD
- বর্ণনা:
COPYএর মতোই কাজ করে, তবে এটি URL থেকে ফাইল ডাউনলোড করার ক্ষমতাও রাখে। - উদাহরণ:
ADD https://example.com/file.tar.gz /app/
৬. WORKDIR
- বর্ণনা: এটি কন্টেইনারে কাজ করার জন্য একটি নির্দিষ্ট ডিরেক্টরি সেট করে। পরবর্তী সমস্ত কমান্ড সেই ডিরেক্টরিতে কার্যকর হবে।
- উদাহরণ:
WORKDIR /app
৭. CMD
- বর্ণনা: কন্টেইনার চালানোর সময় ডিফল্ট কমান্ড এবং আর্গুমেন্ট নির্ধারণ করে। একটি Dockerfile-এ একাধিক
CMDনির্দেশনা থাকতে পারে, তবে কেবল একটি কার্যকর হবে। - উদাহরণ:
CMD ["python3", "app.py"]
৮. ENTRYPOINT
- বর্ণনা: কন্টেইনারের জন্য প্রধান কমান্ড নির্ধারণ করে, যা
CMDদ্বারা নির্ধারিত আর্গুমেন্টের সাথে কাজ করে। - উদাহরণ:
ENTRYPOINT ["python3"]
৯. ENV
- বর্ণনা: কন্টেইনারের জন্য পরিবেশ ভেরিয়েবল সেট করে।
- উদাহরণ:
ENV APP_ENV production
উদাহরণ Dockerfile
নিচে একটি সাধারণ Dockerfile-এর উদাহরণ দেওয়া হলো:
# বেস ইমেজ নির্বাচন
FROM python:3.9-slim
# মেন্টেইনারের তথ্য
LABEL maintainer="your_email@example.com"
# কাজের ডিরেক্টরি সেট করুন
WORKDIR /app
# প্রয়োজনীয় ফাইলগুলি কপি করুন
COPY requirements.txt .
# নির্ভরতাগুলি ইনস্টল করুন
RUN pip install -r requirements.txt
# অ্যাপ্লিকেশন কপি করুন
COPY . .
# ডিফল্ট কমান্ড নির্ধারণ করুন
CMD ["python", "app.py"]
সারসংক্ষেপ
Dockerfile হল Docker Images তৈরি করার জন্য একটি গুরুত্বপূর্ণ উপাদান। এটি বিভিন্ন কমান্ড এবং নির্দেশনা ধারণ করে যা অ্যাপ্লিকেশন এবং তার নির্ভরতাগুলির জন্য কন্টেইনার তৈরির জন্য প্রয়োজনীয়। Dockerfile-এর গঠন এবং উপাদানগুলো বোঝার মাধ্যমে আপনি কাস্টম Docker Images তৈরি করতে পারবেন, যা আপনার অ্যাপ্লিকেশন ডেভেলপমেন্ট এবং ডিপ্লয়মেন্ট প্রক্রিয়াকে সহজতর করবে।
Dockerfile হল একটি টেক্সট ফাইল যা Docker Image তৈরি করতে প্রয়োজনীয় নির্দেশাবলী ধারণ করে। বিভিন্ন নির্দেশাবলী (অথবা উপাদান) ব্যবহার করে আমরা একটি কাস্টম Docker Image তৈরি করতে পারি। এখানে Dockerfile-এর প্রধান উপাদানগুলি: FROM, RUN, CMD, এবং COPY সম্পর্কে বিস্তারিত আলোচনা করা হলো।
১. FROM
- বর্ণনা:
FROMনির্দেশাবলী হল Dockerfile-এর প্রথম নির্দেশনা যা একটি বেস ইমেজ নির্বাচন করে। এটি নতুন ইমেজ তৈরির জন্য ভিত্তি হিসেবে কাজ করে। - ব্যবহার:এখানে,
ubuntu:latestহল একটি বেস ইমেজ যা Ubuntu অপারেটিং সিস্টেমের সর্বশেষ সংস্করণকে নির্দেশ করে।
FROM ubuntu:latest২. RUN
- বর্ণনা:
RUNনির্দেশাবলী ব্যবহৃত হয় কনটেইনার তৈরি করার সময় কমান্ডগুলি চালানোর জন্য। এটি একটি নতুন লেয়ার তৈরি করে এবং সাধারণত সফটওয়্যার বা প্যাকেজ ইনস্টল করতে ব্যবহৃত হয়।
RUN apt-get update && apt-get install -y python3- ব্যবহার:এখানে, এই কমান্ডটি Ubuntu ইমেজে Python3 ইনস্টল করবে এবং একটি নতুন লেয়ার তৈরি করবে।
৩. CMD
- বর্ণনা:
CMDনির্দেশাবলী ব্যবহার করা হয় কনটেইনার শুরু হওয়ার সময় ডিফল্ট কমান্ড বা অ্যাপ্লিকেশন চালানোর জন্য।CMDনির্দেশনাটি কনটেইনারের সর্বশেষ চালনার জন্য ব্যবহৃত হয় এবং কনটেইনারটি যখন চালু হয় তখন এটি কার্যকর হয়। - ব্যবহার:
CMD ["python3", "./app.py"]- এখানে, কনটেইনারটি চালু হলে
app.pyফাইলটি Python3 দিয়ে চালানো হবে।CMDকমান্ডের ব্যবহার থেকে বেরিয়ে যাওয়ার সময় এটি প্রতিস্থাপিত হতে পারে।
৪. COPY
- বর্ণনা:
COPYনির্দেশাবলী ব্যবহার করা হয় লোকাল ফাইল সিস্টেম থেকে কনটেইনারের ফাইল সিস্টেমে ফাইল বা ডিরেক্টরি কপি করার জন্য। - ব্যবহার:এখানে,
requirements.txtফাইলটি Dockerfile যেখানে অবস্থিত সেখানে থেকে কনটেইনারের বর্তমান কাজের ডিরেক্টরিতে কপি করা হবে।
উদাহরণ Dockerfile
একটি সম্পূর্ণ Dockerfile উদাহরণ নিচে দেওয়া হলো যা উপরোক্ত সমস্ত উপাদানগুলি ব্যবহার করে:
# বেস ইমেজ নির্বাচন
FROM python:3.9-slim
# কাজের ডিরেক্টরি তৈরি করুন
WORKDIR /usr/src/app
# প্রয়োজনীয় ফাইল কপি করুন
COPY requirements.txt ./
# নির্ভরশীলতা ইনস্টল করুন
RUN pip install --no-cache-dir -r requirements.txt
# অ্যাপ্লিকেশন ফাইল কপি করুন
COPY . .
# অ্যাপ্লিকেশন চালানোর জন্য কমান্ড নির্ধারণ করুন
CMD ["python", "./app.py"]
সারসংক্ষেপ
- FROM: বেস ইমেজ নির্বাচন করে।
- RUN: কনটেইনার তৈরি করার সময় কমান্ড চালায়।
- CMD: কনটেইনার শুরু হলে ডিফল্ট কমান্ড চালায়।
- COPY: লোকাল ফাইল সিস্টেম থেকে ফাইল বা ডিরেক্টরি কনটেইনারের ফাইল সিস্টেমে কপি করে।
এই উপাদানগুলির সাহায্যে Dockerfile তৈরি করে একটি কাস্টম Docker Image তৈরি করা সম্ভব। Dockerfile হল Docker-এর জন্য একটি গুরুত্বপূর্ণ উপাদান যা অটোমেশন এবং পুনঃব্যবহারযোগ্যতা নিশ্চিত করে।
Docker Image তৈরি করা একটি গুরুত্বপূর্ণ প্রক্রিয়া যা Dockerfile ব্যবহার করে সম্পন্ন হয়। নিচে Image তৈরির ধাপগুলি এবং docker build কমান্ডের ব্যবহার বিস্তারিতভাবে আলোচনা করা হলো।
Docker Image তৈরির ধাপ
১. Dockerfile তৈরি করা
প্রথম ধাপে, আপনাকে একটি Dockerfile তৈরি করতে হবে। এটি একটি টেক্সট ফাইল যা আপনার অ্যাপ্লিকেশন এবং এর নির্ভরতাগুলির জন্য নির্দেশনা ধারণ করে।
Dockerfile-এর উদাহরণ:
# বেস ইমেজ হিসাবে Python ব্যবহার করা হচ্ছে
FROM python:3.9-slim
# কাজের ডিরেক্টরি সেট করুন
WORKDIR /app
# প্রয়োজনীয় ফাইলগুলি কপি করুন
COPY requirements.txt .
# নির্ভরতাগুলি ইনস্টল করুন
RUN pip install -r requirements.txt
# অ্যাপ্লিকেশন কপি করুন
COPY . .
# ডিফল্ট কমান্ড নির্ধারণ করুন
CMD ["python", "app.py"]
২. Docker Image তৈরি করা
Dockerfile তৈরি করার পর, আপনাকে Docker Image তৈরি করতে হবে। এটি docker build কমান্ড ব্যবহার করে করা হয়।
docker build কমান্ড
docker build কমান্ডটি একটি Dockerfile ব্যবহার করে নতুন Docker Image তৈরি করতে ব্যবহৃত হয়।
কমান্ডের গঠন:
docker build [OPTIONS] PATH | URL | -
- OPTIONS: অতিরিক্ত বিকল্প যা প্রয়োগ করা যেতে পারে।
- PATH: যেখানে Dockerfile অবস্থিত।
- URL: যদি Dockerfile একটি URL থেকে পাওয়া যায় তবে এটি উল্লেখ করা হয়।
উদাহরণ:
সাধারণ কমান্ড: যদি আপনার Dockerfile বর্তমান ডিরেক্টরিতে থাকে, তবে আপনি নীচের কমান্ডটি ব্যবহার করতে পারেন:
এখানে:
-t my-app-imageহল আপনার ইমেজের নাম (এবং প্রয়োজনে ট্যাগ)।.নির্দেশ করে যে Dockerfile বর্তমান ডিরেক্টরিতে রয়েছে।
docker build -t my-app-image .
ডেটা ফাইল থেকে Dockerfile তৈরি করা: আপনি একটি ভিন্ন নামের Dockerfile ব্যবহার করতে চাইলে -f অপশন ব্যবহার করতে পারেন:
docker build -t my-app-image -f Dockerfile.dev .
বিল্ড কনটেক্সট: Dockerfile থেকে সব ফাইল এবং ডিরেক্টরি অন্তর্ভুক্ত করার জন্য, আপনার বর্তমান ডিরেক্টরিটি বিল্ড কনটেক্সট হিসেবে নির্ধারণ করতে হবে। এটি Docker কন্টেক্সট দ্বারা সীমাবদ্ধ থাকে, তাই আপনার সমস্ত প্রয়োজনীয় ফাইল সেই কনটেক্সটে থাকতে হবে।
৩. Docker Image যাচাই করা
Docker Image তৈরি করার পর, এটি যাচাই করার জন্য নীচের কমান্ডটি ব্যবহার করুন:
docker images
এটি আপনার সিস্টেমে উপলব্ধ সমস্ত Docker Images তালিকাবদ্ধ করবে, এবং আপনার নতুন তৈরি করা ইমেজটি সেখানে থাকবে।
৪. Docker Image থেকে কন্টেইনার তৈরি করা
Docker Image তৈরি করার পর, আপনি কন্টেইনার তৈরি এবং চালানোর জন্য নিচের কমান্ডটি ব্যবহার করতে পারেন:
docker run -d --name my-app-container my-app-image
এখানে:
-dঅপশনটি কন্টেইনারকে ব্যাকগ্রাউন্ডে চালানোর জন্য।--nameঅপশনটি কন্টেইনারের জন্য একটি নাম নির্ধারণ করে।
সারসংক্ষেপ
Docker Image তৈরির প্রক্রিয়া Dockerfile তৈরি করা এবং docker build কমান্ড ব্যবহার করার মাধ্যমে সম্পন্ন হয়। এটি আপনার অ্যাপ্লিকেশন এবং তার নির্ভরতাগুলির একটি স্বতন্ত্র কন্টেইনার তৈরি করে, যা পুনঃব্যবহারযোগ্য এবং পোর্টেবল। Docker Image তৈরি করার পরে, আপনি সহজেই কন্টেইনার চালাতে পারবেন, যা অ্যাপ্লিকেশন ডেভেলপমেন্ট এবং ডিপ্লয়মেন্ট প্রক্রিয়াকে অনেক সহজ করে তোলে।
Multi-stage builds হল Docker-এর একটি শক্তিশালী ফিচার যা Dockerfile-এর বিভিন্ন অংশকে আলাদা স্টেজে বিভক্ত করে। এই পদ্ধতিতে, একটি ইমেজের একটি স্টেজ থেকে অন্য স্টেজে আউটপুট স্থানান্তর করা হয়, ফলে ইমেজের আকার ছোট এবং নির্মাণের প্রক্রিয়া আরো কার্যকর হয়। নিচে Multi-stage build এবং Dockerfile optimization এর উপর বিস্তারিত আলোচনা করা হলো।
Multi-stage Build
Multi-stage builds এর প্রধান উদ্দেশ্য হল Docker Image-এর আকার কমানো এবং নির্মাণ প্রক্রিয়ার দক্ষতা বাড়ানো।
কিভাবে কাজ করে:
বিভিন্ন স্টেজ: একটি Dockerfile-এ একাধিক FROM নির্দেশনা ব্যবহার করে বিভিন্ন স্টেজ তৈরি করা যায়। প্রতিটি স্টেজ তার নিজস্ব বেস ইমেজ ব্যবহার করতে পারে।
নির্ভরশীলতা ইনস্টলেশন: প্রথম স্টেজে সমস্ত নির্ভরশীলতা ইনস্টল করা হয় এবং অ্যাপ্লিকেশন নির্মাণ করা হয়।
আউটপুট স্থানান্তর: দ্বিতীয় স্টেজে শুধুমাত্র প্রয়োজনীয় ফাইলগুলি স্থানান্তর করা হয়, যেমন সংকলিত বাইনরি বা কনফিগারেশন ফাইল।
উদাহরণ
নিচে একটি Multi-stage Dockerfile এর উদাহরণ দেওয়া হলো:
# প্রথম স্টেজ: বিল্ডিং
FROM golang:1.17 AS builder
WORKDIR /app
COPY . .
# অ্যাপ্লিকেশন বিল্ড করুন
RUN go build -o myapp .
# দ্বিতীয় স্টেজ: প্রযোজ্য ইমেজ তৈরি
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/myapp .
# কনটেইনার চালানোর জন্য কমান্ড
CMD ["./myapp"]
Dockerfile Optimization
Dockerfile-কে অপ্টিমাইজ করার জন্য কয়েকটি গুরুত্বপূর্ণ পদ্ধতি আছে, যা ইমেজের আকার এবং নির্মাণের সময় কমাতে সহায়ক।
১. লেয়ার কমানো
- বর্ণনা: Docker ইমেজে প্রতিটি
RUN,COPY, এবংADDনির্দেশনা একটি নতুন লেয়ার তৈরি করে। লেয়ার সংখ্যা কমানোর চেষ্টা করুন। - কিভাবে: একাধিক কমান্ডকে একটি
RUNকমান্ডে একত্রিত করুন।
RUN apt-get update && apt-get install -y package1 package2
২. ক্যাশে ব্যবহার করা
- বর্ণনা: Docker ইমেজ নির্মাণের সময় ক্যাশে ব্যবহারের ফলে পুনরায় কাজ করার প্রয়োজন হয় না।
- কিভাবে: ফাইলগুলো কম頻নশীল পরিবর্তন হলে সেগুলো আগে রাখুন, যেমন
COPYএবংRUNকমান্ডের আদেশ।
৩. প্রয়োজনীয় ফাইল কপি করা
- বর্ণনা: শুধুমাত্র প্রয়োজনীয় ফাইলগুলো Docker ইমেজে কপি করুন।
- কিভাবে:
.dockerignoreফাইল ব্যবহার করে অপ্রয়োজনীয় ফাইলগুলোকে বাদ দিন।
# .dockerignore
node_modules
*.log
temp/
৪. আর্কিটেকচার এবং ফাইল সিস্টেম নির্বাচন
- বর্ণনা: হালকা বেস ইমেজ নির্বাচন করা।
- কিভাবে:
alpineইমেজ ব্যবহার করা যা সাধারণত ছোট এবং দ্রুত।
৫. কমান্ডের সংখ্যা কমানো
- বর্ণনা: ব্যবহারকারী যখন
CMDবাENTRYPOINTব্যবহার করেন, তখন একটি কমান্ডের ভিতরে সমস্ত আর্গুমেন্টগুলি অন্তর্ভুক্ত করুন। - কিভাবে: JSON সিনট্যাক্স ব্যবহার করুন যা আর্গুমেন্টকে সঠিকভাবে পরিচালনা করে।
CMD ["executable", "param1", "param2"]
সারসংক্ষেপ
Multi-stage builds Dockerfile-এর শক্তিশালী ফিচার যা ইমেজের আকার কমাতে এবং নির্মাণের কার্যকারিতা বাড়াতে সাহায্য করে। Dockerfile অপ্টিমাইজেশন বিভিন্ন পদ্ধতির মাধ্যমে করা যেতে পারে, যেমন লেয়ার সংখ্যা কমানো, ক্যাশে ব্যবহারের সুবিধা নেওয়া, এবং প্রয়োজনীয় ফাইল কপি করা। এই সমস্ত পদ্ধতি Docker ইমেজ তৈরি করার সময় কর্মক্ষমতা এবং কার্যকারিতা উন্নত করতে সহায়ক।
Read more